home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / stdio / RCS / freopen.c,v < prev    next >
Text File  |  1991-12-13  |  6KB  |  286 lines

  1. head     1.7;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.6.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.7
  10. date     91.11.21.18.12.58;  author jhh;  state Exp;
  11. branches ;
  12. next     1.6;
  13.  
  14. 1.6
  15. date     90.02.17.14.47.00;  author douglis;  state Exp;
  16. branches 1.6.1.1;
  17. next     1.5;
  18.  
  19. 1.5
  20. date     90.02.15.17.21.47;  author douglis;  state Exp;
  21. branches ;
  22. next     1.4;
  23.  
  24. 1.4
  25. date     89.11.04.21.50.22;  author douglis;  state Exp;
  26. branches ;
  27. next     1.3;
  28.  
  29. 1.3
  30. date     89.09.11.17.25.55;  author douglis;  state Exp;
  31. branches ;
  32. next     1.2;
  33.  
  34. 1.2
  35. date     88.07.20.18.12.18;  author ouster;  state Exp;
  36. branches ;
  37. next     1.1;
  38.  
  39. 1.1
  40. date     88.06.10.16.23.50;  author ouster;  state Exp;
  41. branches ;
  42. next     ;
  43.  
  44. 1.6.1.1
  45. date     91.12.02.19.57.52;  author kupfer;  state Exp;
  46. branches ;
  47. next     ;
  48.  
  49.  
  50. desc
  51. @@
  52.  
  53.  
  54. 1.7
  55. log
  56. @if was backwards so on reopen our own buffer was used if the stream
  57. previously had its own, and similarly we used the existing buffer
  58. if it was our own.   If the user did a setvbuf before freopen
  59. his buffer would be lost.
  60. @
  61. text
  62. @/* 
  63.  * freopen.c --
  64.  *
  65.  *    Source code for the "freopen" library procedure.
  66.  *
  67.  * Copyright 1988 Regents of the University of California
  68.  * Permission to use, copy, modify, and distribute this
  69.  * software and its documentation for any purpose and without
  70.  * fee is hereby granted, provided that the above copyright
  71.  * notice appear in all copies.  The University of California
  72.  * makes no representations about the suitability of this
  73.  * software for any purpose.  It is provided "as is" without
  74.  * express or implied warranty.
  75.  */
  76.  
  77. #ifndef lint
  78. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/freopen.c,v 1.6 90/02/17 14:47:00 douglis Exp $ SPRITE (Berkeley)";
  79. #endif not lint
  80.  
  81. #include "stdio.h"
  82. #include "fileInt.h"
  83. #include "stdlib.h"
  84. #include <sys/file.h>
  85.  
  86. /*
  87.  *----------------------------------------------------------------------
  88.  *
  89.  * freopen --
  90.  *
  91.  *    Close the file currently associated with a stream and then re-open
  92.  *    the stream on a new file.
  93.  *
  94.  * Results:
  95.  *    The return value is NULL if an error occurred in opening the
  96.  *    new file, or stream otherwise.
  97.  *
  98.  * Side effects:
  99.  *    A file is opened, and a stream is initialized.  Errors in closing
  100.  *    the old stream are ignored.
  101.  *
  102.  *----------------------------------------------------------------------
  103.  */
  104.  
  105. FILE *
  106. freopen(fileName, access, stream)
  107.     char *fileName;        /* Name of file to be opened. */
  108.     char *access;        /* Indicates type of access, just as for
  109.                  * fopen. */
  110.     FILE *stream;        /* Name of old stream to re-use. */
  111. {
  112.     int id, flags, read, write, oldFlags;
  113.  
  114.     if (stream->readProc != (void (*)()) StdioFileReadProc) {
  115.     return (FILE *) NULL;
  116.     }
  117.  
  118.     if (stream->flags != 0) {
  119.     fflush(stream);
  120.     id = (int) stream->clientData;
  121.     close(id);
  122.     }
  123.  
  124.     /*
  125.      * Open a new stream and let it re-use the old stream's structure.
  126.      */
  127.  
  128.     flags = StdioFileOpenMode(access);
  129.     if (flags == -1) {
  130.     return (FILE *) NULL;
  131.     }
  132.     id = open(fileName, flags, 0666);
  133.     if (id < 0) {
  134.     return (FILE *) NULL;
  135.     }
  136.     read = write = 0;
  137.     if ((access[1] == '+') || ((access[1] == 'b') && (access[2] == '+'))) {
  138.     read = write = 1;
  139.     } else if (access[0]  == 'r') {
  140.     read = 1;
  141.     } else {
  142.     write = 1;
  143.     }
  144.     if (access[0] == 'a') {
  145.     (void) lseek(id, 0L, L_XTND);
  146.     }
  147.     oldFlags = stream->flags & (STDIO_NOT_OUR_BUF | STDIO_LINEBUF);
  148.     if (!(stream->flags & STDIO_NOT_OUR_BUF)) {
  149.     Stdio_Setup(stream, read, write, stdioTempBuffer, 0,
  150.         StdioFileReadProc, StdioFileWriteProc, StdioFileCloseProc,
  151.         (ClientData) id);
  152.     } else {
  153.     Stdio_Setup(stream, read, write, stream->buffer, stream->bufSize,
  154.         StdioFileReadProc, StdioFileWriteProc, StdioFileCloseProc,
  155.         (ClientData) id);
  156.     }
  157.     stream->flags |= oldFlags;
  158.     return stream;
  159. }
  160. @
  161.  
  162.  
  163. 1.6
  164. log
  165. @fixed typo w/ streamID v. id var name.
  166. @
  167. text
  168. @d17 1
  169. a17 1
  170. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/freopen.c,v 1.5 90/02/15 17:21:47 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  171. d87 1
  172. a87 1
  173.     if (stream->flags & STDIO_NOT_OUR_BUF) {
  174. @
  175.  
  176.  
  177. 1.6.1.1
  178. log
  179. @Initial branch for Sprite server.
  180. @
  181. text
  182. @d17 1
  183. a17 1
  184. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/freopen.c,v 1.6 90/02/17 14:47:00 douglis Exp $ SPRITE (Berkeley)";
  185. @
  186.  
  187.  
  188. 1.5
  189. log
  190. @make same check as fopen for seeking to end of file.
  191.  
  192.  
  193. @
  194. text
  195. @d17 1
  196. a17 1
  197. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/freopen.c,v 1.4 89/11/04 21:50:22 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  198. d84 1
  199. a84 1
  200.     (void) lseek(streamID, 0L, L_XTND);
  201. @
  202.  
  203.  
  204. 1.4
  205. log
  206. @fix in case already open
  207. @
  208. text
  209. @d17 1
  210. a17 1
  211. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/freopen.c,v 1.3 89/09/11 17:25:55 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  212. d82 3
  213. @
  214.  
  215.  
  216. 1.3
  217. log
  218. @don't refuse to reopen just because the original stream wasn't valid
  219. @
  220. text
  221. @d17 1
  222. a17 1
  223. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/freopen.c,v 1.2 88/07/20 18:12:18 ouster Exp Locker: douglis $ SPRITE (Berkeley)";
  224. d51 1
  225. a51 1
  226.     int id, flags, read, write;
  227. d83 1
  228. d93 1
  229. @
  230.  
  231.  
  232. 1.2
  233. log
  234. @Change file streams so that fdopen can be called more than once
  235. for a given stream id, and get separate buffers.
  236. @
  237. text
  238. @d17 1
  239. a17 1
  240. static char rcsid[] = "$Header: freopen.c,v 1.1 88/06/10 16:23:50 ouster Exp $ SPRITE (Berkeley)";
  241. d53 1
  242. a53 2
  243.     if ((stream->readProc != (void (*)()) StdioFileReadProc)
  244.         || (stream->flags == 0)) {
  245. d57 5
  246. a61 3
  247.     fflush(stream);
  248.     id = (int) stream->clientData;
  249.     close(id);
  250. @
  251.  
  252.  
  253. 1.1
  254. log
  255. @Initial revision
  256. @
  257. text
  258. @d17 1
  259. a17 1
  260. static char rcsid[] = "$Header: atoi.c,v 1.1 88/04/28 17:20:23 ouster Exp $ SPRITE (Berkeley)";
  261. d51 1
  262. a51 1
  263.     int id, newId, flags;
  264. d63 1
  265. a63 2
  266.      * Open a new stream.  If it doesn't get opened in the same slot as
  267.      * the old one, then move it so it is the same.
  268. d70 2
  269. a71 2
  270.     newId = open(fileName, flags, 0666);
  271.     if (newId < 0) {
  272. d74 7
  273. a80 5
  274.     if (newId != id) {
  275.     if (dup2(newId, id) == -1) {
  276.         return (FILE *) NULL;
  277.     }
  278.     close(newId);
  279. d82 8
  280. a89 2
  281.     if (access[0] == 'a') {
  282.     (void) lseek(id, 0, L_XTND);
  283. a90 1
  284.     fdopen(id, access);
  285. @
  286.